iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0

承接上回,關於延遲加載(Lazy Initialization),如果你想要在開啟延遲加載情況下,
針對特定 bean 關閉延遲的話,可以透過 @Lazy(false) 去做關閉,
這樣在初始的情況下就會去創建這些bean 。

但其實我們不一定要先在註冊檔案開啟延遲加載,在透過 @Lazy(false) 去關閉特定 bean。

下方為一個透過 @Lazy 關閉延遲加載的範例

spring:
  main:
    lazy-initialization: true
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver
  jpa:
    spring.jpa.database-platform: org.hibernate.dialect.H2Dialect

solr:
	url: http://localhost:8983/solr

主要註冊類別,透過標籤關閉 bean solrClient 的延遲加載

@Configuration
public class SolrConfig {

    @Value("${solr.url}")
    private String solrUrl;
		
		@Bean
		@Lazy(false)
    public SolrClient solrClient() {
        return new HttpSolrClient.Builder(solrUrl).build();
    }

}

@Lazy 除了可以關閉延遲加載之外,也可以開啟特定bean 的延遲加載。
我們現在都是透過註冊檔案開啟延遲加載,這種方式就是所有的bean都是延遲加載,
但其實可以不需要在註冊檔案中開啟延遲加載,單獨透過 @Lazy 方式去開起特定bean的延遲加載。

下方 application.yml 沒有開啟延遲加載

spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver
  jpa:
    spring.jpa.database-platform: org.hibernate.dialect.H2Dialect

solr:
	url: http://localhost:8983/solr

@Lazy 預設就是 true,放在 bean solrClient 就會開啟他的延遲加載

@Configuration
public class SolrConfig {

    @Value("${solr.url}")
    private String solrUrl;
		
		@Bean
		@Lazy
    public SolrClient solrClient() {
        return new HttpSolrClient.Builder(solrUrl).build();
 

若是放在註冊類別上方,就會將下方的所有 bean 都開啟延遲加載

@Lazy
@Configuration
public class SolrConfig {
		//各種bean 的註冊
}

https://ithelp.ithome.com.tw/upload/images/20231011/20161770lrQ2fpcqch.png
上方為 Annotation Lazy 的文件說明,執得注意的是如果 @Lazy 出現在註冊類別之上,但 @Lazy(false) 出現在 bean method 之上,那後者 @Lazy(false) 就會覆蓋前者的行為。

參考資料
{官方} Annotation Lazy 文件

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Lazy.html

Lazy Loading in Spring Beans
https://medium.com/@omernaci/lazy-loading-in-spring-beans-e6a9945e874d


上一篇
Doc 7.1.2. Lazy Initialization
下一篇
Doc 7.1.4 Customizing SpringApplication
系列文
探索 Spring Boot Doc30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言